package com.bright.cwduijie.duijie.service;

import com.bright.cwduijie.duijie.enums.DataApi;
import com.bright.cwduijie.duijie.pojo.bo.ApiDataCollection;
import com.bright.cwduijie.duijie.pojo.command.DuijieCommand;
import com.bright.cwduijie.duijie.pojo.dto.CheckResultDto;
import com.bright.cwduijie.duijie.pojo.query.DuijieQuery;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

import java.util.List;
import java.util.Map;
import java.util.function.Function;

/**
 * @Author hxj
 * @Date 2024/8/13 10:16
 * @Description
 */
public interface AbstractApiService<T> {

    /**
     * 获取每个表的repository数据JPA对象
     * @return
     */
    JpaSpecificationExecutor getJpaSpecificationExecutor();

    DataApi getDataApi();
    Function<T, Integer> getIdFunc();

    /**
     * 是否存在TYSHXYDM这个字段 如果没这个就是ZT_DATA_KEY做账套标识
     * @return
     */
    default boolean isExistsTYSHXYDMField() {
        return true;
    }

    /**
     * 获取所有需要对接数据的账套
     * @return 账套的DATA_KEY列表
     */
    List<String> getNeedDuijieZtDataKeys(DuijieCommand duijieCommand);

    /**
     * 获取数据并校验数据
     * @param checkResultMap 校验结果
     * @param apiDataCollection 数据集合
     * @param duijieQuery 对接条件
     */
    void getDataAndCheckResults(Map<String, CheckResultDto> checkResultMap,
                                       ApiDataCollection apiDataCollection, DuijieQuery duijieQuery);

    /**
     * 推送数据
     * @param apiDataCollection
     * @param duijieQuery
     * @param batchId
     * @throws JsonProcessingException
     */
    void sendData(ApiDataCollection apiDataCollection, DuijieQuery duijieQuery, String batchId) throws JsonProcessingException;

    /**
     * 推送删除数据
     * @param duijieQuery
     * @param batchId
     * @throws JsonProcessingException
     */
    void sendDeleteData(DuijieQuery duijieQuery, String batchId) throws JsonProcessingException;

    /**
     * 检查全表是否有重复数据
     * @return
     */
    CheckResultDto checkDataKeyDuplicate();

    /**
     * 获取本次推送的数据的所有id值
     * @return
     */
    List<Integer> getDataIds(ApiDataCollection apiDataCollection);

    /**
     * 返回该表标记会计期间年月的字段名称
     * @return 字段名称 若没有则为空字符串
     */
    default String getYearMonthColumnName() {
        return "";
    }

}
